iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 9
1
Software Development

iOS 從 Objective-c 進化為 Swift 的 30天之旅系列 第 9

[Day 9] Swift Extension 與 Class 使用範例

  • 分享至 

  • xImage
  •  

Extension 等價於 Objective-C 的 Category
Category 只能作用於 Class , Extension 則是所有看得到的型別皆可擴充。
Extension 的語法,較 Objective-C 更為簡單易寫。

OC Category

據我認知 Category 應該是在OC .h裡面
宣告void 然後給其他class呼叫使用
範例如下

@interface NSObject(MySuperObject)
-(void) testA;
+(void) testB;
@end

// implementation
@implementation NSObject(MySuperObject)

-(void) testA
{
  NSLog(@"Hello everybody!A!!");
}

+(void) testB
{
  NSLog(@"Hello everybody!B!!");
}

以下是其他class 呼叫其Category

// 建立Book物件
Test *test = [[Test alloc] init];

// instance method from category
[test testA];

Swift extension

以下是宣告範例

extension Double {
    var km: Double { return self * 1000 }
    var m: Double { return self }
    var cm: Double { return self / 100 }
}

直接使用如下
這邏輯也太奇怪了

print(25.2345.km)
print(25.2345.m)
print(25.2345.cm)

這樣可以直接丟值給Double
這感覺東西都差不多
感覺也跟Class差不多
那來研究一下Class

Swift Class

範例一 簡單使用

間單宣告如下

class DataImporter {
    var fileName = "Steven"
}

宣告完以後就可以宣告一個空間
然後修改fileName
使用範例如下

let dataImporter = DataImporter()
print(dataImporter.fileName) //test
dataImporter.fileName = "test2" //修改Class裡面的值
print(dataImporter.fileName) //test2

範例二 加入 Get(Getter) 與 Set(Setter)

介紹應該是使用網路上範例來解釋
宣告部份如下

class GameCharacter {
    var hpValue: Double = 100
    var defenceValue: Double = 300
    var totalDefence: Double {
        get { //沒傳值 直接print 就是get
            return (defenceValue + 0.1 * hpValue)
        }
        set(levelUp) {//有傳值 傳入levelUp
            hpValue = hpValue * (1 + levelUp)
            defenceValue = defenceValue * (1 + levelUp)
        }
    }
}

呼叫部分如下

let oneChar = GameCharacter() //宣告空間
print(oneChar.totalDefence) //get
oneChar.totalDefence = 0.05 //set

使用方法簡單來說
get 就是單存你沒做修改
直接print 或是使用
就會去get的判斷式

如果有修改的話
就會前進至set判斷式
不會進get
這解釋應該很好懂
我自己的理解應該是這樣

除法判斷空值 isInfinite

上次除法做完了
但有BUG
當我使用 數字/0 以後
就會出現 inf
然後造成崩潰
所以除法應該要使用isInfinite的判斷
來避免

priceA = (priceB / priceA)
if priceA.isInfinite {
    priceA = 0
}

其他進度

商品部分兩條有點麻煩
我就改為一條
因為之後可能button需要用程式下去新增
使用會比較活
而且使用者可以自己客製化

最新文章

金魚也學得會的「KD指標」! 什麼是KD黃金交叉、KD死亡交叉 - 2021年

RSI指標? 看我就好 新手好入門


上一篇
[Day 8] Swift 使用單例 singleton 做一個 全域變數
下一篇
[Day 10] Swift UserDefault 在Model裡大爆炸
系列文
iOS 從 Objective-c 進化為 Swift 的 30天之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言